package ar.edu.frba.utn.dds.Conversor;


import java.math.BigDecimal;

import ar.edu.frba.utn.dds.Aerolinea.AeroLinea;
import ar.edu.frba.utn.dds.Busqueda.BusquedaAeroLanchita;
import ar.edu.frba.utn.dds.Excepciones.ConversionException;
import ar.edu.frba.utn.dds.Fecha.Fecha;
import ar.edu.frba.utn.dds.Vuelo.Asiento;
import ar.edu.frba.utn.dds.Vuelo.Vuelo;

import com.lanchita.AerolineaLanchita;

public class ConversorAeroLanchita implements ConversorAerolinea{
	
	private static AerolineaLanchita aeroLanchita = AerolineaLanchita.getInstance();
	
	@Override
	public AeroLinea convertirAerolinea() {
		AeroLinea aerolinea = new AeroLinea();
		aerolinea.setConversorAerolinea(this);
		aerolinea.setBusqueda(new BusquedaAeroLanchita());
		return aerolinea;
	}
	
	public Asiento convertirAsiento(String codigoAsiento,
			String precioAsiento,
			String claseAsiento,
			String ubicacionAsiento,
			String estadoAsiento,
			Boolean reservado,
			String dniUsuario,
			String horaSalida,
			String horaLlegada,
			String origen,
			String destino,
			String fechaSalida,
			String fechaLlegada,
			Integer codigoIndice){
		if (estadoAsiento.equalsIgnoreCase("D")){
			reservado = false;
		}else{
			reservado = true;
		}
		Asiento asiento = new Asiento(null,"", String.valueOf(codigoAsiento), Double.valueOf(String.valueOf(precioAsiento)), claseAsiento, ubicacionAsiento, estadoAsiento,
				reservado, dniUsuario, horaSalida, horaLlegada, origen, destino, fechaSalida, fechaLlegada, codigoIndice);
		
		return asiento;
	}

	@Override
	public void comprar(String dni, Asiento asiento) {
		aeroLanchita.comprar(asiento.getCodigoAsiento());
	}

	@Override
	public void reservar(String dni, Asiento asiento) {
		aeroLanchita.reservar(asiento.getCodigoAsiento(), dni);
	}

	@Override
	public Asiento convertirAsiento(String codigoVuelo, Integer codigoAsiento,
			String fechaDeSalida, String fechaDeLlegada, String horaDeSalida,
			String horaDeLlegada, BigDecimal precio, String estadoAsiento,
			Boolean reservado, String clase, String origen, String destino,
			String ubicacion, Integer codigoIndice) {
		// TODO Auto-generated method stub
		return null;
	}

	@Override
	public Boolean condicionParametrosBusqueda() {
		return true;
	}

	@Override
	public Boolean cumpleCondicionesDeBusqueda(Asiento asiento,
			Vuelo vueloDeseado) throws ConversionException{
			Boolean condicion = this.condicionString(vueloDeseado.getOrigen(),asiento.getVuelo().getOrigen())
					&& 
					this.condicionString(vueloDeseado.getDestino(),asiento.getVuelo().getDestino())
					&&
					this.condicionFechas(vueloDeseado.getFechaSalida(),asiento.getVuelo().getFechaSalida())
					&&
					this.condicionString(vueloDeseado.getHoraSalida(),asiento.getVuelo().getHoraSalida())
					&&
					this.condicionFechas(vueloDeseado.getFechaLlegada(),asiento.getVuelo().getFechaLlegada())
					&&
					this.condicionString(vueloDeseado.getHoraLlegada(),asiento.getVuelo().getHoraLlegada()); 
			return condicion;
		}

	/**
	 * Metodo que se encarga de comparar las fechas para ver si iguales
	 * @param fechaSalida
	 * @param fechaSalida2
	 * @return
	 * @throws ConversionException 
	 */
	private boolean condicionFechas(String fechaViaje, String fechaAsiento) throws ConversionException {
		if (fechaViaje==null){
			return true;
		}else{
			try {
				return (new Fecha().sonLaMismaFecha(fechaViaje, fechaAsiento));
			} catch (ConversionException e) {
				throw new ConversionException(e.getError());
			}
		}
	}
	
	private boolean condicionString(String vueloDeseado, String asiento) {
		if (vueloDeseado==null || vueloDeseado.equalsIgnoreCase(asiento)){
			return true;
		}else{
			return false;
		}
	}

}
